#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 5  // 队列最大容量
typedef int ElemType;
typedef int Status;

// 顺序队列结构体
typedef struct {
    ElemType data[MAXSIZE];  // 存储元素的数组
    int front;               // 队头指针（指向队头元素）
    int rear;                // 队尾指针（指向队尾元素的下一个位置）
} SqQueue;

// 初始化队列
Status InitQueue(SqQueue *Q) {
    Q->front = Q->rear = 0;  // 初始时队头队尾都为0
    return OK;
}

// 判断队列是否为空
Status IsEmpty(SqQueue *Q) {
    return (Q->front == Q->rear) ? OK : ERROR;
}

// 判断队列是否已满（假溢出的根源）
Status IsFull(SqQueue *Q) {
    return (Q->rear == MAXSIZE) ? OK : ERROR;  // 仅判断队尾是否到数组末尾
}

// 入队（队尾插入）
Status EnQueue(SqQueue *Q, ElemType e) {
    if (IsFull(Q)) return ERROR;  // 队列满则无法入队
    Q->data[Q->rear++] = e;        // 元素存入队尾，队尾指针后移
    return OK;
}

// 出队（队头删除）
Status DeQueue(SqQueue *Q, ElemType *e) {
    if (IsEmpty(Q)) return ERROR;  // 队列空则无法出队
    *e = Q->data[Q->front++];      // 取出队头元素，队头指针后移
    return OK;
}

// 打印队列
void PrintQueue(SqQueue *Q) {
    if (IsEmpty(Q)) {
        printf("队列为空\n");
        return;
    }
    printf("队列元素：");
    for (int i = Q->front; i < Q->rear; i++) {
        printf("%d ", Q->data[i]);
    }
    printf("\n");
}

// 测试
int main() {
    SqQueue Q;
    InitQueue(&Q);
    EnQueue(&Q, 1);
    EnQueue(&Q, 2);
    EnQueue(&Q, 3);
    PrintQueue(&Q);  // 1 2 3

    int e;
    DeQueue(&Q, &e);  // 出队1
    PrintQueue(&Q);  // 2 3

    // 假溢出演示：此时数组前有空闲位置（index 0），但队尾已到MAXSIZE，无法入队
    EnQueue(&Q, 4);
    EnQueue(&Q, 5);
    EnQueue(&Q, 6);  // 入队失败（IsFull返回ERROR）
    PrintQueue(&Q);  // 2 3 4 5
    return 0;
}